package net.sf.gazpachoquest.rest.resources;
import javax.validation.constraints.NotNull;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import net.sf.gazpachoquest.domain.user.User;
import net.sf.gazpachoquest.dto.QuestionnaireDefinitionDTO;
import net.sf.gazpachoquest.dto.QuestionnairePageDTO;
import net.sf.gazpachoquest.dto.answers.Answer;
import net.sf.gazpachoquest.facades.QuestionnaireFacade;
import net.sf.gazpachoquest.types.Language;
import net.sf.gazpachoquest.types.NavigationAction;
import net.sf.gazpachoquest.types.RenderingMode;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.wordnik.swagger.annotations.Api;
import com.wordnik.swagger.annotations.ApiOperation;
import com.wordnik.swagger.annotations.ApiParam;
import com.wordnik.swagger.annotations.ApiResponse;
import com.wordnik.swagger.annotations.ApiResponses;
@Path("/questionnaires")
@Api(value = "questionnaires", description = "questionnaires Interface")
@Produces(MediaType.APPLICATION_JSON)
public class QuestionnaireResource {
private static final Logger logger = LoggerFactory.getLogger(QuestionnaireResource.class);
@Autowired
private QuestionnaireFacade questionnaireFacade;
public QuestionnaireResource() {
super();
}
@GET
@Path("/{questionnaireId}/definition")
@ApiOperation(value = "Get questionnaire definition", notes = "More notes about this method", response = QuestionnaireDefinitionDTO.class)
@ApiResponses(value = { @ApiResponse(code = 404, message = "Invalid invitation token supplied"),
@ApiResponse(code = 200, message = "questionnaires available") })
public Response getDefinition(
@NotNull @PathParam("questionnaireId") @ApiParam(value = "Questionnaire id", required = true) Integer questionnaireId) {
Subject subject = SecurityUtils.getSubject();
User principal = (User) SecurityUtils.getSubject().getPrincipal();
subject.checkPermission("questionnaire:read:" + questionnaireId);
logger.debug("Fetching Questionnaire Definition {} for user {}", questionnaireId, principal.getFullName());
QuestionnaireDefinitionDTO questionnaireDefinitionDTO = questionnaireFacade.getDefinition(questionnaireId);
return Response.ok(questionnaireDefinitionDTO).build();
}
@GET
@Path("/{questionnaireId}/page")
@ApiOperation(value = "Fetch the next, current or previous page for the given questionnaire", notes = "More notes about this method", response = QuestionnairePageDTO.class)
@ApiResponses(value = { @ApiResponse(code = 404, message = "Invalid invitation token supplied"),
@ApiResponse(code = 200, message = "questionnaires available") })
public Response getPage(
@NotNull @PathParam("questionnaireId") @ApiParam(value = "Questionnaire id", required = true) Integer questionnaireId,
@ApiParam(name = "mode", value = "Refers how many questions are returned by page.", required = false, defaultValue = "SECTION_BY_SECTION", allowableValues = "QUESTION_BY_QUESTION,SECTION_BY_SECTION,ALL_IN_ONE", allowMultiple = true) @QueryParam("mode") String modeStr,
@ApiParam(name = "preferredLanguage", value = "Preferred Language for the page is availabe", required = true, defaultValue = "EN", allowableValues = "EN,ES,FI", allowMultiple = true) @QueryParam("preferredLanguage") String preferredLanguageStr,
@ApiParam(name = "action", value = "Action fired for the respondent", required = true, defaultValue = "ENTERING", allowableValues = "NEXT,PREVIOUS,ENTERING", allowMultiple = true) @QueryParam("action") String actionStr) {
Subject subject = SecurityUtils.getSubject();
User principal = (User) SecurityUtils.getSubject().getPrincipal();
subject.checkPermission("questionnaire:read:" + questionnaireId);
logger.info("Fetching questionnaire {} for {} user {}", questionnaireId, principal.getFullName());
RenderingMode mode = StringUtils.isNotBlank(modeStr) ? RenderingMode.fromValue(modeStr) : null;
NavigationAction action = NavigationAction.fromString(actionStr);
Language preferredLanguage = Language.fromString(preferredLanguageStr);
QuestionnairePageDTO page = questionnaireFacade.resolvePage(questionnaireId, mode, preferredLanguage, action);
return Response.ok(page).build();
}
@POST
@Path("/{questionnaireId}/answer")
@Consumes(MediaType.APPLICATION_JSON)
@ApiOperation(value = "Allow the respondent save answers")
@ApiResponses(value = { @ApiResponse(code = 404, message = "Invalid invitation token supplied"),
@ApiResponse(code = 200, message = "Answer saved correctly") })
public Response saveAnswer(
@ApiParam(value = "Answer", required = true) Answer answer,
@NotNull @PathParam("questionnaireId") @ApiParam(value = "Questionnaire id", required = true) Integer questionnaireId,
@NotNull @QueryParam("questionCode") @ApiParam(value = "Question Code", required = true) String questionCode) {
Subject subject = SecurityUtils.getSubject();
User principal = (User) SecurityUtils.getSubject().getPrincipal();
subject.checkPermission("questionnaire:update:" + questionnaireId);
logger.debug("User {} saving answers for questionnaireId {}", principal.getFullName(), questionnaireId);
questionnaireFacade.saveAnswer(questionnaireId, questionCode, answer);
return Response.ok().build();
}
}